package 简单.双指针;

/**
 * 给你一个字符串 s ，根据下述规则反转字符串：
 * <p>
 * 所有非英文字母保留在原有位置。
 * 所有英文字母（小写或大写）位置反转。
 * 返回反转后的 s 。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-only-letters/
 */
public class 仅仅反转字母_917 {

    public static void main(String[] args) {

        String s = "Test1ng-Leet=code-Q!";
        //输出："Qedo1ct-eeLg=ntse-T!"
        System.out.println(reverseOnlyLetters("-"));

    }

    /**
     * 双指针
     * 从左右两端分别选择一个英文字母交换位置
     *
     * @param s
     * @return
     */
    public static String reverseOnlyLetters(String s) {
        char[] chars = new char[s.length()];
        int left = 0, right = s.length() - 1;
        while (left <= right) {
            while (right >= 0 && !Character.isLetter(s.charAt(right))) {  //右边界找第一个英文字母
                chars[right] = s.charAt(right);
                right--;
            }
            while (left < s.length() - 1 && !Character.isLetter(s.charAt(left))) {  //左边界找第一个英文字母
                chars[left] = s.charAt(left);
                left++;
            }
            if (right < 0 || left > s.length() - 1) break;  //左边界到达最右边界说明字符串全部完成
            chars[right] = s.charAt(left);
            chars[left] = s.charAt(right);
            left++;
            right--;
        }
        return String.valueOf(chars);
    }

}
